package cn.yeamin.ms.service.support;


import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import cn.yeamin.ms.commons.Constats;
import cn.yeamin.ms.utils.IsEmptyUtils;
import cn.yeamin.ms.vo.support.BaseVO;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

/**
 * @classDesc: 功能描述:(BaseService)
 * @author: 李彤
 * @createTime: 2017年7月2日 下午10:25:57
 * @version: v1.0
 * @copyright:奕明(上海)影视传媒有限公司
 */
public abstract class BaseService<T extends BaseVO> {

    /**
     *
     * @methodDesc: 功能描述:(定义一个抽象方法,强制让子类复写用来获取不同的Mapper,但是Spring4支持泛型注入)
     * @author: 李彤
     * @param: @return
     * @createTime:2017年7月2日 下午10:30:28
     * @returnType:@return Mapper<T>
     * @copyright:奕明(上海)影视传媒有限公司
     */
    // public abstract Mapper<T> getMapper();

    /**
     * Spring4支持泛型注入
     */
    @Autowired
    private Mapper<T> mapper;

    /**
     *
     * @methodDesc: 功能描述:(根据id查询数据)
     * @author: 李彤
     * @param: @param id
     * @param: @return
     * @createTime:2017年7月2日 下午10:34:09
     * @returnType:@param id
     * @returnType:@return T
     * @copyright:奕明(上海)影视传媒有限公司
     */
    public T queryById(Long id) {
        return mapper.selectByPrimaryKey(id);
    }

    /**
     *
     * @methodDesc: 功能描述:(查询所有的数据)
     * @author: 李彤
     * @param: @return
     * @createTime:2017年7月2日 下午10:35:15
     * @returnType:@return List<T>
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @Cacheable(cacheNames="otherCache")
    public List<T> queryAll() {
        return mapper.select(null);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据条件查询一条数据)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:35:59
     * @returnType:@param record
     * @returnType:@return T
     * @copyright:奕明(上海)影视传媒有限公司
     */
    public T queryOne(T record) {
        return mapper.selectOne(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据条件查询数据列表)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:41:23
     * @returnType:@param record
     * @returnType:@return List<T>
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @Cacheable(cacheNames="otherCache")
    public List<T> queryListByWhere(T record) {
        return mapper.select(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据条件分页查询数据列表)
     * @author: 李彤
     * @param: @param record
     * @param: @param pageNum
     * @param: @param pageSize
     * @param: @return
     * @createTime:2017年7月2日 下午10:45:06
     * @returnType:@param record
     * @returnType:@param pageNum
     * @returnType:@param pageSize
     * @returnType:@return PageInfo<T>
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @Cacheable(cacheNames="otherCache")
    public PageInfo<T> queryPageListByWhere(T record, Integer pageNum, Integer pageSize) {
        // 设置分页条件,基于插件的分页助手
        PageHelper.startPage(pageNum, pageSize);
        // 查询分页数据
        List<T> data = mapper.select(record);
        // 获取分页数据
        return new PageInfo<T>(data);
    }

    /**
     *
     * @methodDesc: 功能描述:(保存数据)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:47:37
     * @returnType:@param record
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
   @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer save(T record) {
        // 设置创建时间
        record.setCreateTime(new Date());
        // 设置更新时间,为了程序的严谨性,和创建时间一直
        record.setUpdateTime(record.getCreateTime());
        return mapper.insert(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(有选择性的保存数据,选择不为null的字段做保存)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:48:31
     * @returnType:@param record
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer saveSelective(T record) {
        // 设置创建时间
        record.setCreateTime(new Date());
        // 设置更新时间,为了程序的严谨性,和创建时间一直
        record.setUpdateTime(record.getCreateTime());
        return mapper.insertSelective(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(更新数据)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:52:37
     * @returnType:@param record
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
   @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer update(T record) {
        // 设置更新时间
        record.setUpdateTime(new Date());
        return mapper.updateByPrimaryKey(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(有选择性的更新数据,选择不为null的字段做更新)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:53:08
     * @returnType:@param record
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer updateSelective(T record) {
        // 创建时间不能更新
        record.setCreateTime(null);
        record.setUpdateTime(new Date());
        return mapper.updateByPrimaryKeySelective(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据主键id删除数据)
     * @author: 李彤
     * @param: @param id
     * @param: @return
     * @createTime:2017年7月2日 下午10:55:54
     * @returnType:@param id
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer deleteById(Long id) {
        return mapper.deleteByPrimaryKey(id);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据ids批量删除数据)
     * @author: 李彤
     * @param: @param ids
     * @param: @param clazz
     * @param: @param property
     * @param: @return
     * @createTime:2017年7月2日 下午10:59:02
     * @returnType:@param ids
     * @returnType:@param clazz
     * @returnType:@param property
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
   @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer deleteByIds(List<Object> ids, Class<T> clazz, String property) {
        Example example = new Example(clazz);
        example.createCriteria().andIn(property, ids);
        return mapper.deleteByExample(example);
    }

    /**
     *
     * @methodDesc: 功能描述:(根据条件删除数据)
     * @author: 李彤
     * @param: @param record
     * @param: @return
     * @createTime:2017年7月2日 下午10:59:21
     * @returnType:@param record
     * @returnType:@return Integer
     * @copyright:奕明(上海)影视传媒有限公司
     */
   @CacheEvict(allEntries=true,cacheNames={Constats.OTHERCACHENAME,Constats.RESOURCECACHENAME,Constats.ROLECACHENAME})
    public Integer deleteByWhere(T record) {
        return this.mapper.delete(record);
    }

    /**
     *
     * @methodDesc: 功能描述:(查询商品列表,按照更新时间倒序排序)
     * @author: 李彤
     * @param: @param pageNum
     * @param: @param pageSize
     * @param: @param clazz
     * @param: @param orderByClause
     * @param: @return
     * @createTime:2017年7月5日 下午10:32:10
     * @returnType:@param pageNum
     * @returnType:@param pageSize
     * @returnType:@param clazz
     * @returnType:@param orderByClause
     * @returnType:@return PageInfo<T>
     * @copyright:奕明(上海)影视传媒有限公司
     */
    @Cacheable(cacheNames="otherCache")
    public PageInfo<T> queryPageListOrderBy(Integer pageNum, Integer pageSize, Class<T> clazz,
            String orderByClause) {
        // 设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 设置动态条件查询
        Example example = new Example(clazz);
        example.setOrderByClause(orderByClause);
        List<T> list = mapper.selectByExample(example);
        return new PageInfo<T>(list);
    }
    
    @Cacheable(cacheNames="otherCache")
    public PageInfo<T> queryPageListOrderBy(Integer pageNum, Integer pageSize, Class<T> clazz,
            String orderByClause,String text,List<String> property) {
        // 设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 设置动态条件查询
        Example example = new Example(clazz);
        example.setOrderByClause(orderByClause);
        if(!IsEmptyUtils.isEmptyForStr(text)) {
        	text = "%" + text + "%";
        	for (int i = 0; i < property.size(); i++) {
        		String pro = property.get(i);
				if( i == 0) {
					example.createCriteria().andLike(pro, text);
					continue;
				}
				example.or(example.createCriteria().andLike(pro, text));
			}
        }
        List<T> list = mapper.selectByExample(example);
        return new PageInfo<T>(list);
    }

}
